package com.wtwd.campus.service;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wtwd.campus.common.RespCodeEntity;
import com.wtwd.campus.common.RespEntity;
import com.wtwd.campus.entity.*;
import com.wtwd.campus.model.vo.DeviceFlagVo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author mjy
 * @date 2021/06/09
 * @description
 */
public interface DeviceInfoService {
    /**
     * 获取设备增加信息
     *
     * @param userId
     * @param type   0：按月查看，1：进30天，2进7天
     * @param year
     * @return
     * @throws ParseException
     */

    List<Map<String, Object>> getDeviceIncreased(Integer userId, Integer type, Integer year) throws ParseException;

    /**
     * 获取设备的数量信息
     *
     * @param orgCode
     * @return
     */
    Map<String, Object> getDeviceCountInfo(String orgCode);

    DeviceInfo getDeviceInfoByStudentId(Integer stuId);

    /**
     * 更新学生绑定的设备
     *
     * @param oldDeviceId(旧的设备id)
     * @param voStudent
     * @return
     */
    Integer updateBindDevice(Integer oldDeviceId, VoStudent voStudent);

    List<Map<String, Object>> getDeviceImeiAndDeviceIdByOrgCodeLikeImei(String imei, String orgCode);

    //获取SIM卡列表
    Map<String, Object> getSimCardList(QuerySimCardDataVo data);

    //修改设备sim卡号
    RespEntity modifySimCard(ModifyDeviceDataVo data);

    Map<String, Object> getDeviceInfoListByCondition(HashMap<String, Object> searchMap, Page<Object> page);

    List<Map<String, Object>> getModelByOrgCode(String orgCode);

    Integer deleteDeviceById(Integer deviceId);

    Integer saveDeviceInfo(DeviceInfo deviceInfo);

    RespCodeEntity checkDeviceInfo(DeviceInfo deviceInfo);

    List<ExcelExportDeviceInfo> ExcelExportDeviceInfo(HashMap<String, Object> searchMap);

    RespEntity importDeviceInfo(MultipartFile file, String orgCode, String orgName, HttpServletResponse response);

    DeviceInfo getDeviceInfoByImei(String imei);

    Integer updateDeviceInfo(DeviceInfo deviceInfo);

    RespEntity addClassesPattern(List<DeviceClassPattern> deviceClassPatterns, SysUser sysUser);

    DeviceInfo getDeviceInfoByDeviceId(Integer deviceId);

    //根据imei号获取设备
    DeviceInfo getDeviceByImei(String imei);

    //修改设备信息
    Integer modifyDeviceInfo(DeviceInfo deviceInfo);

    //获取设备离线发送存储指令
    List<Map<String, Object>> getOffLineBufferCmd(String imei);

    //删除设备离线发送储存指令
    Integer deleteOffLineBufferCmd(String imei);

    //删除一台设备的亲情号码
    Integer deleteAffectionByDeviceId(Integer deviceId);

    //删除一台设备的白名单
    Integer deleteWhiteListByDeviceId(Integer deviceId);

    //删除一台设备的课堂模式
    Integer deleteClassPatternByDeviceId(Integer deviceId);

    /**
     * 查询客户的设备列表
     *
     * @param customerId 客户id
     * @param imei       imei
     * @param currPage   当前页
     * @param pageSize   页面容量
     * @return
     */
    Map<String, Object> getCustomerDeviceList(Integer customerId, String imei, Integer currPage, Integer pageSize);

    /**
     * 校验imei和是否属于该客户
     *
     * @param imei
     * @param customerId
     * @return
     */
    DeviceInfo verifyDeviceCustomer(String imei, Integer customerId);

    /**
     * 获取设备最近的一调定位信息
     *
     * @param imei
     * @return
     */
    LocationDataVo getDeviceLastLocation(String imei);

    /**
     * 获取设备某一时间段内的运动轨迹
     *
     * @param imei
     * @param beginTime
     * @param endTime
     * @return
     */
    List<LocationDataVo> getDeviceOrbit(String imei, Long beginTime, Long endTime);

    /**
     * 修改设备模式
     *
     * @param imei
     * @param mode
     * @param interval
     * @param commandNumber
     * @return
     */
    int updateDeviceMode(String imei, Integer mode, Integer interval, String commandNumber);

    /**
     * 更新设备模式的指令序列号
     *
     * @param imei
     * @param commandNumber
     * @return
     */
    int updateDeviceModeStatus(String imei, String commandNumber);

    /**
     * 根据学生id查找设备
     *
     * @param stuId
     * @return
     */
    DeviceInfo getDeviceInfoByStuId(Integer stuId);


    RespEntity importCustomerDeviceInfo(MultipartFile file, HttpServletResponse response);

    DeviceSetting getDeviceSettingByDeviceId(Integer deviceId);

    int modifyDeviceInfoSetting(DeviceSetting data);

    List<Map<String, Object>> getStudentPlaceByStudentId(List<Integer> list);

    List<Map<String, Object>> getStudentPlaceByDeviceId(List<Integer> list);

    List<Map<String, Object>> getStudentPlaceByDeviceIdAndH5UserId(List<Integer> list, Integer userId);

    Integer deleteSOSList(Integer deviceId);

    List<String> getImeiListByDeviceIdList(List<Integer> list);

    Integer bindDevice(Integer stuId, Integer deviceId);

    Integer unbindStudentByDeviceId(Integer deviceId);

    Integer bindDeviceAndSynchronizationOrg(VoStudent voStudent);

    Map<String, Object> getModeStatusByDeviceId(Integer deviceId, String imei);

    int unBindingStudentWithDevice(Integer stuId);

    List<DeviceInfo> getDeviceInfoListByStuIdList(List<Integer> list);

    Map<String, Object> getThirdPartDeviceList(ThirdPartDeviceVO data);

    RespEntity importThirdPartDevice(MultipartFile file, HttpServletResponse response);

    RespEntity importNXDevice(MultipartFile file, HttpServletResponse response, String mode);

    DeviceInfo getDeviceInfoByRfid(String rfid);

    RespEntity importVcomDevice(MultipartFile file, HttpServletResponse response);

    /* LtAuthKey getLtAuthKeyByImei(String imei);*/

    RespEntity importVcomLtDevice(MultipartFile file, HttpServletResponse response);

    /**
     * 此方法用于鉴别监听号码是否存在于sos,白名单，亲情号中
     * 当设备不存在sos,白名单情亲号可以任意拔打
     * <p>
     * 存在返回 true
     * 不存在返回false
     * 当设备没有设备号码时返回true
     *
     * @param deviceId
     * @param number
     * @return
     */
    Boolean authMonitorNumber(Integer deviceId, String number);

    /**
     * 批量添加设备
     *
     * @param deviceInfos
     * @return
     */
    boolean bathAddDeviceInfo(List<DeviceInfo> deviceInfos);

    /**
     * 根据组织code和锁卡开关状态查询设备
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockCardInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 根据组织code和锁机开关查询设备
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockDeviceInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 根据组织code和锁网开关查询设备
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockNetInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 只用户测试统计数据
     * 线上不允许使用
     *
     * @return
     */
    List<DeviceInfo> getDeviceByAll();

}
